package com.atguigu.guli.service.base.handler;

import com.atguigu.guli.service.base.exception.GuliException;
import com.atguigu.guli.service.base.result.R;
import com.atguigu.guli.service.base.result.ResultCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Date;

//@ControllerAdvice //controller的异常处理注解，返回值会当做视图对象解析
@Slf4j //编译时提供logback日志对象可以输出日志
@RestControllerAdvice
public class GlobalExceptionHandler {

    //提供异常处理器
    //1、最大的异常处理
    @ExceptionHandler(value = Exception.class)
    public R exception(Exception e){ //exception方法中一定要通过形参接受类型为ExceptionHandler中指定的异常对象
        System.out.println("e = " + ExceptionUtils.getStackTrace(e));
        return R.error();
    }
    //3、处理自定义类型的异常
    @ExceptionHandler(value = GuliException.class)
    public R exception(GuliException e){
        return R.setResultCodeEnum(e.getCodeEnum());// 根据异常传过来的信息生成指定的R对象
    }
    //2、具体异常的处理
    // BadSqlGrammarException
    @ExceptionHandler(value = BadSqlGrammarException.class)
    public R exception(BadSqlGrammarException e){ //exception方法中一定要通过形参接受类型为ExceptionHandler中指定的异常对象
//        System.out.println("e = " + ExceptionUtils.getStackTrace(e));
        log.info("{}级别的日志，现在时间:{}","info" , new Date()); //{}代表占位符
        log.warn("{}级别的日志，现在时间:{}","warn" , new Date());
        log.error("{}级别的日志，现在时间:{},错误信息：{}","error" , new Date(),ExceptionUtils.getStackTrace(e));

        return R.setResultCodeEnum(ResultCodeEnum.BAD_SQL_GRAMMAR);
    }
}
